/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package tsb.grafo;

/**
 *
 * @author Kapica
 */
import tsb.dominio.conexiones.Conexion;
import java.util.ArrayList;
import java.util.Iterator;

public class Matriz {

   private ArrayList<Conexion> aux;
   private ArrayList<ArrayList<Conexion>> matriz;

    public Matriz()//genero la matriz de tamanio 1x1
    {
      aux =new ArrayList<Conexion>();
      aux.add(null);
      matriz= new ArrayList<ArrayList<Conexion>>();
      matriz.add(aux);
     // toString();

    }

    public ArrayList<ArrayList<Conexion>> getArrayConexiones() {
        return matriz;
    }
    
    public boolean aumentar()
    {

     Iterator i= matriz.iterator();
     while(i.hasNext())
     {
        aux=(ArrayList<Conexion>)i.next();//escaneo la matriz y voy agregando componentes
        if(!aux.add(null))
            return false;
     }

      aux =new ArrayList<Conexion>();
      for(int j=0;j<matriz.size()+1;j++)
      {
        if( !aux.add(null))
         return false;

      }

      matriz.add(aux);
      return true;

    }

/**
 * Metodo utilizado para quitar un nodo del grafo cuando no existen coexiones en el grafo
 */
    public void reducir()
    {
        matriz.remove(matriz.size()-1);
        Iterator i= matriz.iterator();
        while(i.hasNext())
        {
            aux=(ArrayList<Conexion>)i.next();
            aux.remove(aux.size()-1);
        }
    }
    
    public boolean eliminarNodo(int indice)
    {
        matriz.remove(indice);
        Iterator i= matriz.iterator();
        while(i.hasNext())
        {
            ArrayList<Conexion> aux=(ArrayList<Conexion>)i.next();
            aux.remove(indice);
        }
        return true;
    }

    public boolean agregarConexion(Conexion conec,int origen, int destino)
    {

      matriz.get(origen).set(destino, conec);//se busca en la matriz la posicion del origen y le agregamos la conexion de destino
      matriz.get(destino).set(origen, conec);//se busca en la matriz la posicion del destino y le agregamos la conexion de origen
      return true;
    }

   public boolean eliminarConexion(int origen, int destino)
    {
       matriz.get(origen).set(destino, null);
       matriz.get(destino).set(origen, null);
       return true;
   }
   
   public boolean eliminarConexion(String nombreAMostrar)
   {
       try{
       for(int i=0; i<this.matriz.size();i++)
       {
           for(int j=0;j<this.matriz.get(i).size();i++)
           {
               if(this.matriz.get(i).get(j)!=null)
               {
                   if(this.matriz.get(i).get(j).getNombre().compareTo(nombreAMostrar)==0)
                   {
                       matriz.get(i).set(j, null);
                       matriz.get(j).set(1, null);
                       return true;
                   }
                   
               }
               
           }
       }
       }
       catch(Exception e)
       {}
       
       
       
       return false;   
   }
/*
 * verifica si el nodo posee conexion activa con otro nodo del grafo
 */
//
    public String toString()
    {
        String cadena="";
        Iterator i= matriz.iterator();
        int contador=1;

     for(int k=0; k<matriz.size();k++)
     {
         cadena+="    "+(k+1);

     }
     cadena+="\n";
     while(i.hasNext())
     {
        cadena+=contador;
        aux=(ArrayList<Conexion>)i.next();//escaneo la matriz y voy agregando componentes
        Iterator j= aux.iterator();

        while(j.hasNext())
        {
           Conexion cosa=(Conexion)j.next();
           if(cosa==null)
             cadena+=" null  ";
           else
               cadena=cadena+" "+cosa.getNombre()+" ";
               //cadena+=" C ";
        }
        contador++;
         cadena+="\n";
     }

     
        return cadena;
    }
}
